/*

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.una.pol.ii.is2.controller;

import com.sun.rave.web.ui.appbase.AbstractPageBean;
import com.sun.webui.jsf.component.Accordion;
import com.sun.webui.jsf.component.AccordionTab;
import com.sun.webui.jsf.component.Hyperlink;
import com.sun.webui.jsf.component.Label;
import java.util.Hashtable;
import java.util.List;
import java.util.StringTokenizer;
import javax.ejb.EJB;
import javax.faces.FacesException;
import py.una.pol.ii.is2.domain.sistema.Modulo;
import py.una.pol.ii.is2.domain.sistema.Pantalla;
import py.una.pol.ii.is2.domain.sistema.Usuario;
import py.una.pol.ii.is2.facade.sistema.AccesoConAutenticacionFacade;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @version MenuPrincipal.java
 * @version Created on 01/05/2009, 05:43:50 PM
 * @author markos
 */
public class MenuPrincipal extends AbstractPageBean {
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }

    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public MenuPrincipal() {
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     * 
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    @Override
    public void init() {
        // se inicializa el menu
        if (getSessionBean1().getAccordionMenu() == null) {
            armaMenu();
        }


        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here

        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("MenuPrincipal Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

    // </editor-fold>
    // Perform application initialization that must complete
    // *after* managed components are initialized
    // TODO - add your own initialization code here
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean1 getSessionBean1() {
        return (SessionBean1) getBean("SessionBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected RequestBean1 getRequestBean1() {
        return (RequestBean1) getBean("RequestBean1");
    }
    @EJB
    private AccesoConAutenticacionFacade autenticacion;
    private Label lblUsuario = new Label();
    private Pantalla pantalla;

    public void setPantalla(Pantalla pantalla) {
        this.pantalla = pantalla;
    }

    public Label getLblUsuario() {
        lblUsuario.setText(getSessionBean1().getUsuario().getUsuaNombre());
        return lblUsuario;
    }

    public void setLblUsuario(Label lblUsuario) {
        this.lblUsuario = lblUsuario;
    }

    protected ControlAcceso getControlAcceso(){
        return (ControlAcceso) getBean("ControlAcceso");
    }

    

    /**
     *
     * Inicializa la tabla hash que almacena los niveles de acceso,
     * por cada pantalla del usuario en sesion actual.
     *
     * @param usuario
     * @throws java.lang.Exception
     */
    public void initTablaPermisos(Usuario usuario) throws Exception {
        Hashtable tablaPantallas = new Hashtable();
        StringTokenizer token;
        try {
            for (String item : autenticacion.getListaPantallaPermisos(usuario)) {
                token = new StringTokenizer(item, "-");
                tablaPantallas.put(token.nextToken(), Integer.parseInt(token.nextToken()));
            }
            getSessionBean1().setTablaPantallas(tablaPantallas);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }

    }

    /**
     * Metodo encargado de la construccion del menu a partir de los
     * modulos y pantallas a las que el usuario logeado tiene acceso.
     *
     *
     */
    private void armaMenu() {
        Accordion accordionMenu = new Accordion();
        String sModuloId = "";
        Usuario usuario = getSessionBean1().getUsuario();
        String sPantallaId = "";
        String sPantallaTit = "";
        List<Pantalla> listaPantalla = null;
        List<Modulo> listaModulo;
        AccordionTab nodoModulo = null;
        Hyperlink nodoPantalla = null;
        List lRoot = null;
        List lChild = null;
        try {
            initTablaPermisos(usuario);
            // se arma el menu
            lRoot = accordionMenu.getChildren();
            // Erase previous contents
            lRoot.clear();
            listaModulo = autenticacion.getListaCodigoModulos(usuario);
            for (Modulo modulo : listaModulo) {
                //Root Menu (Level1)
                sModuloId = modulo.getModuCod();
                nodoModulo = new AccordionTab();
                nodoModulo.setId("modulo" + sModuloId);
                nodoModulo.setStyle("font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px;");
                nodoModulo.setTitle(modulo.getModuDescripcion());
                lRoot.add(nodoModulo);

                //Children Menu (Level2)
                lChild = nodoModulo.getChildren();
                lChild.clear();

                listaPantalla = autenticacion.getListaCodigoPantallas(usuario, modulo);
                for (Pantalla codPantalla : listaPantalla) {
                    sPantallaId = codPantalla.getPantNombre();
                    sPantallaTit = codPantalla.getPantAlias();
                    nodoPantalla = new Hyperlink();
                    nodoPantalla.setId("pantalla" + sPantallaId.substring(0, sPantallaId.length() - 4));
                    nodoPantalla.setStyleClass("clase_hiperlink");
                    nodoPantalla.setText(sPantallaTit + '\n');
                    String url = sPantallaId;
                    nodoPantalla.setUrl(url);
                    lChild.add(nodoPantalla);
                }
            }
            
            nodoModulo = new AccordionTab();
            nodoModulo.setTitle("Menu Principal");
            nodoModulo.setId("moduloMenuPrincipal");
            nodoModulo.setStyle("font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px;");
            
            
            Hyperlink menuPrincipal = new Hyperlink();
            menuPrincipal.setId("pantallaMenuPrincipal");
            menuPrincipal.setStyleClass("clase_hiperlink");
            menuPrincipal.setText("Menu Principal");
            menuPrincipal.setUrl("MenuPrincipal.jsp");
            
            lRoot.add(nodoModulo);
            nodoModulo.getChildren().clear();
            nodoModulo.getChildren().add(menuPrincipal);

            accordionMenu.setVisible(true);
            getSessionBean1().setAccordionMenu(accordionMenu);
        } catch (Exception ex) {
            ex.printStackTrace();
            log("Error al generar el Menu : ", ex);
            error("Error al generar el Menu: " + ex);
            return;
        }
    }
}

